home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / d86v311a.arc / 02DEM.DOC < prev    next >
Text File  |  1987-09-25  |  12KB  |  232 lines

  1. CHAPTER 2   D86 DEMONSTRATION                                 2-1
  2.  
  3. To demonstrate some of the powers of D86, let's walk through a
  4. D86 session.  You should print out a copy of this chapter (file
  5. 02DEM.DOC) and also the file HEXOUT.8. Using those listings, go
  6. through the following steps.  You may wish to check them off as
  7. you go through them, to keep track of where you are.
  8.  
  9. 1. Make sure your current directory contains all the files
  10.    A86.COM, D86.COM, and HEXOUT.8.
  11.  
  12. 2. Assemble the HEXOUT program by typing the command A86
  13.    HEXOUT.8.  The A86 assembler will create the files HEXOUT.COM
  14.    and HEXOUT.SYM.  Look over the listing of the program, to get
  15.    acquainted with what it does.
  16.  
  17. 3. Now comes the moment of truth, especially if you do not have a
  18.    real IBM-PC. Find out if the debugger works on your machine,
  19.    by typing the command D86 HEXOUT 41 42 5A.
  20.  
  21.    If all goes well, the screen should blank; and the D86
  22.    debugger screen should appear.  The blinking cursor should be
  23.    at the bottom left.  A sign-on message should appear at the
  24.    upper right.  A disassembly of the HEXOUT program should be in
  25.    the upper left.  The label HEXOUT should appear on the first
  26.    line, followed on the second line by the address 0100 and the
  27.    instruction MOV SI,TAIL_BUFF.  To the left of the address
  28.    should be a reverse-video pound sign.  If you don't see all of
  29.    these things, refer to Chapter 3 to initiate actions to let me
  30.    know how I might fix the problem.
  31.  
  32. 4. Let's look at what we already have.  Notice the display of
  33.    register values in the lower left corner.  The values are all
  34.    4-digit hexadecimal.  At the top of the second column of
  35.    registers is a sequence of lower-case letters. This is the
  36.    flags display.  Each small letter stands for a flag whose
  37.    value is currently TRUE.  The flags settings are those that
  38.    were handed to D86 by the operating system starting the
  39.    program; for MSDOS V3,1, the settings are "i z e".  That
  40.    display indicates that the interrupt flag "i", the zero flag
  41.    "z", and the parity-even flag "e" are all TRUE; the other
  42.    flags are FALSE. To the right of the registers are six lines
  43.    labelled 1: through 6:.  These are the memory window lines.
  44.    Since you haven't specified any memory windows yet, they
  45.    contain nothing but their numbers.  Below the memory-window
  46.    lines is a line labelled 0:.  This is the stack display line.
  47.    The number 0: gives the number of words on the stack,
  48.    currently zero because nothing has been pushed onto the stack.
  49.                                                              2-2
  50.  
  51. 5. Observe that the sign-on message tells you to press Alt-F10
  52.    for help.  Do so (that is, hold down the Alt-key while
  53.    pressing the F10 key).  You are now in help-mode, where you
  54.    will remain until you press Alt-F10 again.  D86 will keep
  55.    changing the help-window, depending on what it thinks you are
  56.    doing. Right now you have a summary of the main function-keys,
  57.    plus a few other things.  Press F10 (without the Alt), and
  58.    you'll get a summary of one-letter debugger commands.  Press
  59.    F10 a second time and you'll get a summary of Ctrl-key
  60.    commands.  Finally, press F10 a third time to return to the
  61.    function-key help screen.
  62.  
  63. 6. Let's try an immediate assembly-language instruction. Press
  64.    the "M" key.  Note that the reverse-video block jumps from the
  65.    pound-sign within the disassembly, down to the line just above
  66.    the blinking cursor.  The block is the debugger's cursor; the
  67.    blinking cursor is the program's console output cursor.  The
  68.    debugger does not use the blinking cursor because we do not
  69.    want the program's output to interfere with the debugger's
  70.    output.  Also note that the help-window is now telling you
  71.    that you are typing in an assembly-language line.
  72.  
  73. 7. Complete the line MOV AX,123.  The debugger immediately
  74.    executes the assembly language line you just typed, setting
  75.    the register AX.  Note that you did not have to learn a
  76.    debugger command for setting registers; if you know A86, you
  77.    already know how to set registers!  The value of AX is now
  78.    007B, which may surprise you if you expected 0123.  A86's
  79.    default base is 10, so 123 was taken as decimal; which is hex
  80.    7B.  Type MOV AX,0123 instead, to get a value of hex 123.
  81.  
  82. 8. Let's now play with the flags display.  Type the line ADD
  83.    AL,05D, which changes AL (the last two digits of AX) to hex
  84.    80, and alters the flags to "o is a ".  The interrupt flag is
  85.    still on; but zero and parity-even are now off.  They have
  86.    been replaced by "o" overflow, "s" sign, and "a" auxiliary
  87.    carry.
  88.  
  89. 9. Type the line consisting of just CMC.  This is the Complement
  90.    Carry instruction.  Observe that the "c" appears.  Notice also
  91.    that the CMC that you typed remains on the screen.  Notice on
  92.    the help window the entry "F3 RepeatCmd".  This tells you that
  93.    the F3 key will repeat the last line-command (not function-
  94.    key) that you typed.  Press F3 several times, to see the carry
  95.    flag toggle on and off.  Isn't that the cleanest flags display
  96.    you've ever seen?
  97.                                                              2-3
  98.  
  99. 10. Let's single-step an instruction.  Press the F1 key.  This
  100.    executes the program instruction, loading the SI register with
  101.    TAIL_BUFF.  The disassembly cursor moves down to the next
  102.    instruction.  Observe that SI has changed to 0081, which is
  103.    the pointer to the invocation command-tail, which should
  104.    contain the string typed after HEXOUT: " 41 42 5A" followed by
  105.    a carriage-return code (hex 0D).
  106.  
  107. 11. Let's examine memory to verify that last assertion.  Press
  108.    the "1" key. The cursor jumps to the start of memory-window 1,
  109.    and the help-window gives you a huge choice of memory types to
  110.    display.  The entry "ByteHex 2" tells us that "B" will cause
  111.    hex bytes to be displayed.  The "2" indicates that the display
  112.    occupies a fixed number of display bytes for every memory
  113.    unit, namely 2 hex digits.  Type B followed by a comma, to
  114.    indicate that you want nothing but hex bytes to be displayed.
  115.    Now the help window asks for a segment location.  Let's use
  116.    the DS register: type DS followed by a comma. Now the help
  117.    window wants an offset within the segment: type SI.  Before
  118.    typing the terminating ENTER, backspace-out what you have
  119.    typed, and watch the help-windows regress appropriately.
  120.    Isn't that impressive?  Now retype the line, "B,DS,SI".  Note
  121.    that when you press ENTER, the line fills out with hex values:
  122.    20 34 31 20 34 32 20 35 41 0D etc.  (61 instead of 41 is OK;
  123.    it means you typed the invocation in lower-case.)
  124.  
  125. 12. Let's look at the same line, displayed as text.  Type "2",
  126.    moving to memory line 2, then type the line "T,SI".  This time
  127.    you specified type T for text, and you left out the segment-
  128.    register specification.  D86 uses DS when you leave out the
  129.    segment register; so in this case you'll get the same segment.
  130.    This time the display starts with "41 42 5AM"; the "M" is the
  131.    carriage-return, which is control-M, ambiguously displayed.
  132.    You can read Chapter 6 later on for descriptions of all the
  133.    types, including other text types allowing non-ambiguous
  134.    displays.
  135.  
  136. 13. Let's execute the next instruction, CALL GET_HEX.  Here we
  137.    have a choice, between executing the procedure all at once, or
  138.    stepping into the procedure to execute its instructions one at
  139.    a time.  Let's try stepping in first: type the F1 key.  The
  140.    cursor jumps to location GET_HEX, on the same disassembly
  141.    screen.  The SP register decrements from FFFE to FFFC, and a
  142.    value 0106 appears on the stack.  This is the return address,
  143.    pointing to the instruction following CALL GET_HEX.
  144.  
  145. 14. Watch memory lines 1 and 2 as you press F1 again, single-
  146.    stepping the LODSB instruction.  You had set up the lines to
  147.    be pointed to by SI.  Since SI changes when LODSB is executed,
  148.    the memory-displays advance to the next byte. Note that the AL
  149.    register contains the value hex 20, a blank.
  150.                                                              2-4
  151.  
  152. 15. In a normal debugging session, we would continue stepping
  153.    within GET_HEX, but let's not do that right now.  Instead,
  154.    press the F6 "TrapRet" key, which starts the program going,
  155.    trapping at the return address on top of the stack, which was
  156.    0106.  The cursor jumps back up to location 0106, the value is
  157.    no longer on the stack, and SI and the memory-displays have
  158.    advanced to 0084.
  159.  
  160. 16. Let's try the classic "G" command, common to all debuggers.
  161.    Type the line "G,0103", noticing the help-windows as you go
  162.    along.  After you press ENTER, the program runs until it gets
  163.    back to the trap address you provided, 0103. Note that the
  164.    program has called OUT_VALUE to output the "A" that
  165.    corresponds to your input hex 41.  The "A" appears on the
  166.    bottom line, and the blinking cursor advances.
  167.  
  168. 17. Let's execute the next CALL GET_HEX all at once, by pressing
  169.    the F2 ProcStep key.  SI advances again, and AL is loaded with
  170.    the next value 42.
  171.  
  172. 18. Notice that the disassembly is symbolic: the display is CALL
  173.    GET_HEX, not CALL 0112 as lesser debuggers might give you.
  174.    Let's try symbolic input: type the line "B,HEX_DIGIT?",
  175.    causing the debugger to set a fixed trap at location
  176.    HEX_DIGIT?.  Now set your program running with a simple G
  177.    followed by the ENTER key.  The program traps at HEX_DIGIT?.
  178.    Since this location is not in the disassembly window, the
  179.    window is regenerated, and the cursor placed at HEX_DIGIT?.
  180.    The memory displays now point to the final number "5A".
  181.  
  182. 19. Press F3 to repeat the G-command.  The program traps at
  183.    HEX_DIGIT? again, with SI advanced to the "A".  Press F3
  184.    again; advancing SI to the final carriage-return.
  185.  
  186. 20. Press F3 yet again.  Since HEX_DIGIT? is never reached again,
  187.    the program runs to its completion.  D86 automatically traps
  188.    at the EXIT instruction: in this case, it is INT 021 with the
  189.    AH register set to hex 4C, the function number for EXIT.  If
  190.    we try to start the program again from here, we will be frozen
  191.    here: we must issue the Q command to exit the session.  Don't
  192.    do it yet, though.
  193.  
  194. 21. Before exiting, let's check out HEX_DIGIT? more thoroughly.
  195.    First, we clear the breakpoint we set, by typing "B" followed
  196.    by the ENTER key.
  197.  
  198. 22. Type the command line "J 0200", jumping to a scratch-pad
  199.    memory area.  Then press the F7 key, entering Patch Memory
  200.    mode.  The cursor moves into the disassembled instruction,
  201.    signalling that whatever you type is clobbering it.
  202.                                                              2-5
  203.  
  204. 23. Type in the lines "INC BL", "MOV AL,BL", and "JMP
  205.    HEX_DIGIT?".  Press ENTER at the beginning of the fourth line,
  206.    exiting Patch Memory mode.  The cursor will return to the left
  207.    of the 0200 INC BL line.
  208.  
  209. 24. Type the immediate command "MOV BL,'0'-2".  The BL register
  210.    should change to the evaluated value, hex 2E.
  211.  
  212. 25. Execute the patch-subroutine by typing the line "CALL 0200".
  213.    The value BL increments to 2F, which is one less than the
  214.    lowest digit, '0'.  The Carry flag is set, indicating that
  215.    HEX_DIGIT? has correctly judged 2F not to be a hex digit.  Now
  216.    press F3 repeatedly, executing your patched subroutine for
  217.    each decimal digit.  The "c" will disappear as the values
  218.    advance; and AL will hold the correct binary value for each
  219.    hex digit BL.  When BL reaches 3A, the "c" comes back on
  220.    again, indicating that we are beyond the decimal digits.  When
  221.    BL reaches 41, "c" goes off, and AL values of 10 through 15
  222.    are displayed.  When BL reaches "47" "c" comes on yet again,
  223.    because G is not a decimal digit.  Type "MOV BL,05F", followed
  224.    by "CALL 0200", followed by F3 several more times to verify
  225.    correct action for the range of lower-case 'a' through 'f'.
  226.    You have, relatively quickly, done a thorough test of
  227.    HEX_DIGIT?.  How long would that have taken on a lesser
  228.    debugger?
  229.  
  230. 26. Type Q followed by ENTER to exit the debugger.
  231.  
  232.